from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings


class FastDFSStorage(Storage):
    """自定义文件存储系统类"""
    def __init__(self, client_conf=None, base_url=None):
        """
        初始化
        :param client_conf: fastdfs客户端配置文件
        :param base_ur:  storage ip :端口
        """
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_BASE_URL



    def _open(self, name, mode='rb'):
        """打开文件"""
        pass

    def _save(self, name, content):
        """
        上传图片时会调用此方法
        :param name:
        :param content:
        :return: 返回file_id 存储到image字段
        """
        # 创建fdfd客户端
        # client = Fdfs_client('meiduo_mail/utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_conf)


        # 上传文件
        # client.upload_by_filename()  # 如果指定一个文件路径和文件名来上传用此方法   filename 上传图片文件有后缀
        ret = client.upload_by_buffer(content.read())   # 如果是通过文件数据的二进制来上传用buffer 上传的图片在storage中没有后缀

        # 安全判断
        if ret.get('Status') != 'Upload successed.':
            raise Exception('文件上传失败')

        # 返回file_id
        return ret.get('Remote file_id')

    def exists(self, name):
        """
        判断要上传的文件是否已存在，如果不存在就调用save上传
        :param name: 需判断的文件名
        :return: True or False
        """
        return False
        # return 'http://192.168.68.54:8888/' + name


    def url(self, name):
        """
        当访问image字段的url属性时， 自动调用此url方法拼接文件 生成完整url
        :param name:    save 方法返回的file_id
        :return: storage ip :port + file_id
        """
        # return 'http://192.168.68.54:8888/' + name
        # return settings.FDFS_BASE_URL + name
        return self.base_url + name
